package com.zpark.pay_face_to_face.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.zpark.config.AlipayConfig;
import com.zpark.pay_face_to_face.service.IPToPPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 业务层接口实现类
 */
@Service
@Slf4j
public class PToPPayServiceImpl implements IPToPPayService {

    @Autowired
    private AlipayConfig alipayConfig;

    /**
     * 创建订单，电脑网站支付
     * @return
     * @throws AlipayApiException
     */
    @Override
    public String createOrder() throws AlipayApiException {
        // 创建默认的支付宝客户端
        AlipayClient client = new DefaultAlipayClient(
                alipayConfig.getUrl(),
                alipayConfig.getAppid(),
                alipayConfig.getRsaPrivateKey(),
                alipayConfig.getFormat(),
                alipayConfig.getCharset(),
                alipayConfig.getZhiFuPublicKey(),
                alipayConfig.getSignType());

        // 2. 创建 Request并设置Request参数
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();  // 发送请求的 Request类
        // 设置异步通知地址
        request.setReturnUrl("https://310dx2074ys0.vicp.fun/h5/notify");
        request.setNotifyUrl("https://310dx2074ys0.vicp.fun/h5/success");

        // 创建json对象，用于存放请求参数
        JSONObject bizContent = new JSONObject();

        // 必传参数
        bizContent.put("out_trade_no", System.currentTimeMillis()+"");  // 我们自己生成的订单编号
        bizContent.put("total_amount", "9899"); // 订单的总金额
        bizContent.put("subject", "华为笔记本电脑");   // 支付的名称
        // 指定支付方式为电脑网站支付
        bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");  // 固定配置

        // 设置请求参数
        request.setBizContent(bizContent.toString());

        // 执行请求，拿到响应的结果，返回给浏览器
        String form = "";
        try {
            form = client.pageExecute(request).getBody(); // 调用SDK生成表单
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        return form;
    }


    /**
     * 创建订单，生成二维码支付
     * @return
     * @throws AlipayApiException
     */
    @Override
    public String createOrder2() throws AlipayApiException {
        // 创建支付宝客户端
        AlipayClient alipayClient = new DefaultAlipayClient(
                alipayConfig.getUrl(),
                alipayConfig.getAppid(),
                alipayConfig.getRsaPrivateKey(),
                alipayConfig.getFormat(),
                alipayConfig.getCharset(),
                alipayConfig.getZhiFuPublicKey(),
                alipayConfig.getSignType());

        // 创建预下单请求对象
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

        // TODO 设置支付成功同步回调地址
        request.setReturnUrl("https://310dx2074ys0.vicp.fun/h5/success");
        request.setNotifyUrl("https://310dx2074ys0.vicp.fun/h5/notify");

        // 创建封装请求参数对象
        AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();

        String orderId = System.currentTimeMillis() + "";
        System.out.println(orderId);
        // 设置订单号
        model.setOutTradeNo(orderId);
        // 设置订单金额
        model.setTotalAmount("99.9");
        // 设置订单名称
        model.setSubject("荣耀手环3.0");
        // 指定支付方式为当面付
        model.setProductCode("FACE_TO_FACE_PAYMENT");

        // 设置商品详情信息
        JSONObject json = new JSONObject();
        json.put("goods_id", "9527");
        json.put("goods_name", "荣耀手环3.0 黑色/黑金");
        json.put("count", 1);
        json.put("price", "99.9");
        json.put("goods_category", "电子产品");
        json.put("goods_url", "https://www.taobao.com");

        model.setBody("" + json.toString() + "");

        // 设置测试业务参数
        request.setBizModel(model);

        // 执行预下单请求
        AlipayTradePrecreateResponse response = alipayClient.execute(request);

        // 判断预下单请求是否成功
        if (response.isSuccess()) {
            // 获取生成的支付二维码信息
            final String qrCode = response.getQrCode();
            // 打印二维码信息到控制台
            System.out.println("二维码信息：" + qrCode);
            // 返回生成的支付二维码地址
            return qrCode;
        } else {
            // 返回生成支付二维码失败的信息
            return "生成支付二维码失败：" + response.getSubMsg();
        }
    }
}
